# 函数function

## 函数定义和调用
def hello():
    print("hello")

hello()

def add(a,b):
    return a+b
add             #<function __main__.add>
add(1,2)        #3
x=add
x(1,2)          #函数其实也是一种数据类型！！！

## 函数参数
def add(a,b):return a+b
add(1,1.5)
add('abc','def')
add((1,2,3),(4,))
add([1,2,3],[4])

add(a='ab',b='cd')
add(b='ab',a='cd')

def add(a,b=100):return a+b     #带默认值的参数应当放在后面

def add(a,*b):                  #多参
    s=a
    for x in b:
        s+=x
    return s

def add(a,*b,c):                  #此时c是必传参数！！不论方法体有没有用到它
    s=a+c
    for x in b:
        s+=x
    return s

add(1,2,3)      #add() missing 1 required keyword-only argument: 'c'
add(1,2,3,c=2)

def add(a,b):                   #函数内部定义的函数只能内部用了
    def getSum(x):
        s=0
        for n in x:
            s+=ord(n)
        return s
    return getSum(a)+getSum(b)

add('12','12')
add.getSum('12')                #报错


##lambda函数   lambda 参数表:表达式     表达式只能是一个，不能多句话
add=lambda a,b:a+b
add(1,2)

def fac(n):
    if n==0:
        return 1
    else:
        return n*fac(n-1)
fac(5)

# 函数就是变量，所以可以做参数
d=[add,fac]
d[0](1,2)
d[1](5)




